Import necessary modules¶
In [1]:
from pathlib import Path
from ipyniivue import download_dataset
DATA_FOLDER = Path("images")
download_dataset(
"https://niivue.com/demos/images/",
dest_folder=DATA_FOLDER,
files=[
"mean_func.nii.gz",
"cope1.nii.gz",
"tstat1.nii.gz",
],
)
Downloading mean_func.nii.gz...
Downloading cope1.nii.gz...
Downloading tstat1.nii.gz... Dataset downloaded successfully to images.
In [2]:
import ipywidgets as widgets
from IPython.display import display
from ipyniivue import NiiVue
# Create NiiVue instance
nv = NiiVue(
back_color=(0.2, 0.2, 0.3, 1),
)
volume_list = [
{
"path": DATA_FOLDER / "mean_func.nii.gz",
"opacity": 1,
"colormap": "gray",
},
{
"path": DATA_FOLDER / "cope1.nii.gz",
"colormap": "winter",
"opacity": 0,
"cal_min": 0.0,
"cal_max": 100,
},
{
"path": DATA_FOLDER / "tstat1.nii.gz",
"opacity": 1,
"colormap": "warm",
"cal_min": 0,
"cal_max": 4.5,
},
]
nv.load_volumes(volume_list)
nv.overlay_outline_width = 0.25
nv.volumes[0].colorbar_visible = False
nv.opts.is_colorbar = True
nv.set_interpolation(True)
nv.scene.crosshair_pos = (0.55, 0.5, 0.8)
nv.opts.slice_type = "MULTIPLANAR"
# Setup dropdowns, sliders, and checkboxes
display_mode_dropdown = widgets.Dropdown(
options=[("func", 0), ("cope", 1), ("tstat", 2), ("modulate", 3)],
value=3, # default is 'modulate'
description="Display:",
)
tmax_slider = widgets.IntSlider(
min=1,
max=50,
value=45,
description="tMax",
)
cmax_slider = widgets.IntSlider(
min=1,
max=200,
value=100,
description="cMax",
)
outline_slider = widgets.FloatSlider(
min=0,
max=4,
value=1,
description="Outline",
)
clipdark_checkbox = widgets.Checkbox(
value=False,
description="ClipDark",
)
modulate_alpha_checkbox = widgets.Checkbox(
value=True,
description="ModulateAlpha",
)
# Setup callback functions
def on_tmax_slider_change(change):
"""Set tmax."""
nv.volumes[2].cal_max = 0.1 * change["new"]
tmax_slider.observe(on_tmax_slider_change, names="value")
def on_cmax_slider_change(change):
"""Set cmax."""
nv.volumes[1].cal_max = change["new"]
cmax_slider.observe(on_cmax_slider_change, names="value")
def on_outline_slider_change(change):
"""Set overlay outline width."""
nv.overlay_outline_width = 0.25 * change["new"]
outline_slider.observe(on_outline_slider_change, names="value")
def on_clipdark_checkbox_change(change):
"""Set alpha clip dark."""
nv.opts.is_alpha_clip_dark = change["new"]
clipdark_checkbox.observe(on_clipdark_checkbox_change, names="value")
def on_modulate_alpha_checkbox_change(change):
"""Modulate alpha."""
on_display_mode_change({"new": display_mode_dropdown.value})
modulate_alpha_checkbox.observe(on_modulate_alpha_checkbox_change, names="value")
def on_display_mode_change(change):
"""Handle display mode change."""
mode = change["new"]
nv.set_opacity(0, 1.0) # background opaque
nv.set_opacity(1, 0.0) # hide cope
nv.set_opacity(2, 0.0) # hide tstat
idx = min(2, mode)
nv.set_opacity(idx, 1.0)
if mode == 3: # modulate
nv.set_opacity(1, 1.0) # show cope
nv.set_opacity(2, 0.0) # hide tstat
modulate_alpha = modulate_alpha_checkbox.value
nv.set_modulation_image(
nv.volumes[1].id, # modulate this volume (cope)
nv.volumes[2].id, # with this volume (tstat)
modulate_alpha,
)
else:
nv.set_modulation_image(nv.volumes[1].id, "")
display_mode_dropdown.observe(on_display_mode_change, names="value")
# On volumes loaded/ready actions
@nv.on_image_loaded
def set_initial_display(volume):
"""Set initial display mode."""
if all(v.id for v in nv.volumes):
on_display_mode_change({"new": display_mode_dropdown.value})
nv.on_image_loaded(set_initial_display, remove=True) # remove after 1st run
# Handle location changes
location_output = widgets.HTML(value=" ")
@nv.on_location_change
def handle_location_change(location):
"""Handle location changes."""
location_output.value = " " + location["string"]
# Display all
controls = widgets.VBox(
[
display_mode_dropdown,
tmax_slider,
cmax_slider,
outline_slider,
clipdark_checkbox,
modulate_alpha_checkbox,
]
)
display(widgets.VBox([controls, nv, location_output]))
nv.scene.scene_data
Out[2]:
{'gamma': 1.0,
'azimuth': 110.0,
'elevation': 10.0,
'crosshair_pos': [0.55, 0.5, 0.8],
'clip_planes': [[0.0, 0.0, 0.0, 0.0]],
'clip_plane_depth_azi_elevs': [[2.0, 0.0, 0.0]],
'vol_scale_multiplier': 1.0,
'pan2d_xyzmm': [0.0, 0.0, 0.0, 1.0]}